#ifndef CHARACTER_HH
#define CHARACTER_HH

#include "ICharacter.hh"
#include <vector>
#include <string>

class Character : public ICharacter {
private:
    std::string name;
    std::string description; 
    unsigned health;
    unsigned maxHealth;
    unsigned attackPower;
    unsigned defense;
    std::vector<Item*> inventory; // 创建一个存储 Item 指针的动态数组 这个 vector 存储的元素类型是 Item*（指向 Item 类对象的指针）。
    Item* equippedWeapon;
    Item* equippedArmor;
    bool invincible; //是否无敌

public:
    Character(std::string n, std::string desc, unsigned hp, unsigned maxHp, 
             unsigned atk, unsigned def, bool inv = false);
    ~Character() override;
    bool isAlive() const override;
    bool takeDamage(unsigned damage) override;
    bool attack(ICharacter& target) override; //接受一个 ICharacter 类型的引用（&），命名为 target。
    std::string getName() const override;
    std::string getDescription() const override;
    unsigned getHealth() const override;
    unsigned getAttack() const override;
    unsigned getDefense() const override;
    std::string toString() const override; //转字符串
    void addToInventory(Item* item); //指针类型
    void equipItem(size_t index); //根据传入的索引值 index，从某个物品容器（如 std::vector<Item*>）中取出对应物品，并将其装备到角色身上。size_t​：C/C++ 中表示“大小”或“索引”的无符号整数类型（通常是 unsigned int 或 unsigned long）。
    std::string getEquippedWeapon() const;
    std::string getEquippedArmor() const;
    const std::vector<Item*>& getInventory() const { return inventory; } //提供对类内部 inventory 的只读访问，允许外部代码查看物品列表，但禁止修改。
    bool removeItem(const std::string& itemName, int count = 1); //
    void displayInventory() const;
    void display() const;
    bool isInvincible() const { return invincible; }
    unsigned getMaxHealth() const { return maxHealth; }
};

#endif // CHARACTER_HH